/////////////////////////////////////////////////////////////////////////////////////////////////
//
// IL2C - A translator for ECMA-335 CIL/MSIL to C language.
// Copyright (c) 2016-2019 Kouji Matsui (@kozy_kekyo, @kekyo2)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//	http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
/////////////////////////////////////////////////////////////////////////////////////////////////

using System;
using System.Runtime.CompilerServices;

namespace IL2C.ILConverters
{
    [TestCase(123, "Int32Value")]
    [TestCase("ABC", "StringValue")]
    [TestCase(null, "NullValue")]
    [TestCase(123, new[] { "RefIntValue", "Return_RefInt" }, true)]
    [TestCase(456, new[] { "RefIntValue", "Return_RefInt" }, false)]
    [TestCase(null, "Void")]
    public sealed class Ret
    {
        [MethodImpl(MethodImplOptions.ForwardRef)]
        public static extern int Int32Value();

        [MethodImpl(MethodImplOptions.ForwardRef)]
        public static extern string StringValue();

        [MethodImpl(MethodImplOptions.ForwardRef)]
        public static extern object NullValue();

        [MethodImpl(MethodImplOptions.ForwardRef)]
        private static extern ref int Return_RefInt(ref int a, ref int b, bool select);

        [MethodImpl(MethodImplOptions.ForwardRef)]
        public static extern int RefIntValue(bool select);

        [MethodImpl(MethodImplOptions.ForwardRef)]
        public static extern void Void();
    }
}
